<?php
	final class MyException extends Exception {
		/* color para los mensajes */
		private $color = '#a00';
		
		/* creamos una nueva funcion para obtener los mensajes */
		public function getMensaje($html = False) {
			return (
				/* verificamos si esta activada la salida HTML */
				$html ?
				/* le damos un color rojo al mensaje de error */
				"<font style='color:{$this->color};'>{$this->message}</font>" . (
					/* verificamos si ya tiene el archivo origen */
					strstr($this->message, $this->getFrom($html)) ?
					/* si lo tiene no agregamos nada */
					'' :
					/* si no lo tiene agregamos los datos del archivo */
					$this->getFrom($html)
				) :
				/* si no esta habilitada la salida HTML retornamos el mensaje plano */
				$this->message . (
					/* verificamos si ya tiene el archivo origen */
					strstr($this->message, $this->getFrom($html)) ?
					/* si lo tiene no agregamos nada */
					'' :
					/* si no lo tiene agregamos los datos del archivo */
					$this->getFrom($html)
				)
			);
		}
		
		public function getFrom($html = False) {
			/* obtenemos los datos de los archivos que producen la exepcion */
			$datos = $this->getTrace();
			/** *************** **/
			/// print_r($datos);
			/** *************** **/
			/* obtenemos la fuente */
			$fuente = $datos[(count($datos) - 1)];
			/* obtenemos el destino */
			$destino = $datos[0];
			/* obtenemos el nombre de la funcion llamada */
			$functionCalled = (
				/* si no es una clase */
				$fuente['class'] == '' ?
				/* agregamos la palabra 'Function' */
				'Function ' :
				/* sino, si es una clase agregamos el nombre de la misma */
				$fuente['class'] . '::'
			/* agregamos el metodo o funcion que se llamo */
			) . $fuente['function'] . '()';
			/* armamos la cadena con el nombre del fichero, linea de error y la funcion */
			$cadenaFile = $functionCalled .(
				/* verificamos si existe un fichero fuente */
				isset($fuente['file']) ?
				/* si existe el fichero fuente */
				' ' . (
					/* verificamos si esta activada la salida HTML */
					$html ?
					/* le damos formato a la salida */
					'</i>called from<i>' :
					/* sino, enviamos el texto plano */
					'called from'
				/* agregamos el nombre del fichero fuente */
				) . ' ' . basename($fuente['file']) . (
					/* verificamos si esta activada la salida HTML */
					$html ?
					/* le damos formato a la salida (nro de linea) */
					'</i>:' . $fuente['line'] . '<i>' :
					/* sino, enviamos la linea en texto plano */
					':' . $fuente['line']
				) :
				/* si no existe puede que se alla llamado desde el metodo __destruct de la clase */
				''
			);
			/* retornamos el mensaje de error y la cadena de datos del fichero */
			return (
				/* verificamos si esta activada la salida HTML */
				$html ?
				/* le damos formato a la salida */
				" [<i>$cadenaFile</i>]" :
				/* sino, enviamos la linea en texto plano */
				" [$cadenaFile]"
			);
		}
	}
?>